package com.demo.testpackage;

import lombok.extern.slf4j.Slf4j;

import java.io.*;

/**
 * @author zhiqiang
 */
@Slf4j
public class Io {
    public static void main(String[] args) throws IOException {
        Io io = new Io();
        // 创建File对象，对文件夹操作
        File file = new File("/Users/zhiqiang/test/test.txt");
        File file2 = new File("/Users/zhiqiang/test/t2.txt");
        io.createFile(file);
        io.createFile(file2);
    }

    /**
     * file对象api
     *
     * @param file
     * @throws IOException
     */
    public void fileDetail(File file) throws IOException {
        // 获取文件名
        System.out.println(file.getName());
        // 获取文件绝对路径
        System.out.println(file.getAbsolutePath());
        // 获取文件绝对路径
        System.out.println(file.getAbsoluteFile());
        // 获取上级文件绝对路径
        System.out.println(file.getParentFile());
        // 获取文件绝对路径
        System.out.println(file.getCanonicalFile());
        // 获取上级文件绝对路径
        System.out.println(file.getParent());
    }

    /**
     * 判断其上级文件夹是否存在，如果不存在，则创建上级文件夹
     * mkdir() 只创建上级文件夹， mkdirs() 可依次创建上及文件夹
     * createNewFile() 创建文件
     *
     * @param file
     */
    public void createFile(File file) throws IOException {
        if (!file.getParentFile().exists()) {
            log.info("当前文件所在目录不存在，正在创建其上级目录...");
            file.mkdirs();
            log.info("上级目录创建成功。");
        }
        if (!file.exists()) {
            log.info("当前文件【{}】不存在，正在创建该文件...", file.getName());
            file.createNewFile();
            log.info("文件创建成功。");
        }
    }

    /**
     * 将本地一个文件写入到另外一个文件
     * 多次读取并不会在后追加
     *
     * @param file
     * @param file2
     * @throws IOException
     */
    public void copyFile(File file, File file2) throws IOException {
        // 创建文件输入流，将目标文件写入到指定文件中
        FileOutputStream fileOutputStream = new FileOutputStream(file2);
        // 创建文件输入流，打印文件
        FileInputStream fileInputStream = new FileInputStream(file);
        byte[] buffer = new byte[1024];
        while (true) {
            int byteRead = fileInputStream.read(buffer);
            if (byteRead == -1) {
                break;
            }
            fileOutputStream.write(buffer, 0, byteRead);
        }
        log.info("文件读取完毕。");
        try {
            fileInputStream.close();
        } catch (IOException e) {
            log.error("流关闭失败。", e);
        }
        try {
            fileOutputStream.close();
        } catch (IOException e) {
            log.error("流关闭失败。", e);
        }
    }

    /**
     * 创建文件输入流，读取文件
     * 创建文件读取流，打印文件
     *
     * @param file
     * @throws IOException
     */
    public void writeFile(File file) throws IOException {
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(file);
        } catch (FileNotFoundException e) {
            log.error("创建文件输入流失败", e);
        }
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        while (bufferedReader.readLine() != null) {
            System.out.println(bufferedReader.readLine());
        }
        try {
            inputStreamReader.close();
            inputStream.close();
        } catch (IOException e) {
            log.error("关闭流失败", e);
        }
    }
}
